package aopDemoAnno;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;

@Aspect  //替换applicationContext.xml中的<aop:aspect/>
@Component
public class LoggingAspect {
    //@Before()//替换 <aop: before/>
    //execution()替换<aop: point-cut/>
    @Before("execution(* aopDemoAnno.ACImpl.*(..))")
    //方法的参数JoinPoin表示连接点(表示add方法)
    void beforeMethod(JoinPoint jp){
        System.out.println("前置通知："+
                jp.getSignature().getName()+"("+
                Arrays.asList(jp.getArgs())+
                ") 方法之前, 执行切面类的beforeMethod()方法");
    }


    @AfterReturning("execution(* aopDemoAnno.ACImpl.*(..))")
        //方法的参数JoinPoin表示连接点(表示add方法)
    void returningMethod(JoinPoint jp){
        System.out.println("返回通知： add("+Arrays.asList(jp.getArgs())+
                ")方法返回数据之前, 执行切面类的returningMethod()方法");
    }


    @After("execution(* aopDemoAnno.ACImpl.*(..))")
        //方法的参数JoinPoin表示连接点(表示add方法)
    void afterMethod(JoinPoint jp){
        System.out.println("后置通知："+
                jp.getSignature().getName()+"("+
                Arrays.asList(jp.getArgs())+
                ") 方法执行之后，切面类的afterMethod()方法");
    }

    @AfterThrowing(value = "execution(* aopDemoAnno.*.divide*(..))")
        //方法的参数JoinPoin表示连接点(表示add方法)
    void afterThrowing(JoinPoint jp){
        System.out.println("异常通知："+
                jp.getSignature().getName()+"("+
                Arrays.asList(jp.getArgs())+
                ") 方法抛出异常时，切面类的afterThrowing()方法");
    }


    @Around(value = "execution(* aopDemoAnno.*.divide*(..))")
        //方法的参数JoinPoin表示连接点(表示add方法)
    Object aroundMethod(ProceedingJoinPoint jp){
        String methodName=jp.getSignature().getName();
        Object result=null;
        try{
            System.out.println("环绕通知中的-前置通知："+jp.getSignature().getName()+"("+Arrays.asList(jp.getArgs())+")之前执行的部分");
            //执行目标对象的方法(divide方法)

            Integer[] args={20,10};
            //result=jp.proceed();
            result=jp.proceed(args);//修改目标对象的方法的参数(divide方法方法的参数)
            System.out.println("环绕通知中的-后置通知："+jp.getSignature().getName()+"("+Arrays.asList(jp.getArgs())+")之后执行的部分");
        }catch (Throwable e){
            System.out.println("环绕通知-异常："+jp.getSignature().getName()+":方法抛出异常时"+e);
        }
        return  result;
    }

}
